package com.demo.java.antlr;

import com.google.common.collect.Maps;

import java.util.Map;

public class MySqlBaseVisitor extends SqlBaseBaseVisitor<Integer> {
    private Map<String, Integer> varibleMap = Maps.newHashMap();

    // 输出
    @Override
    public Integer visitPrintExpr(SqlBaseParser.PrintExprContext ctx) {
        int value = visit(ctx.expr());
        System.out.println(value);
        return value;
    }

    @Override
    public Integer visitBlank(SqlBaseParser.BlankContext ctx) {
        return super.visitBlank(ctx);
    }

    // 分配变量
    @Override
    public Integer visitAssign(SqlBaseParser.AssignContext ctx) {
        String id = ctx.ID().getText();
        int value = visit(ctx.expr());
        varibleMap.put(id, value);
        return value;
    }

    @Override
    public Integer visitParens(SqlBaseParser.ParensContext ctx) {
        return visit(ctx.expr());
    }

    @Override
    public Integer visitMulDiv(SqlBaseParser.MulDivContext ctx) {
        int left = visit(ctx.expr(0));
        int right = visit(ctx.expr(1));
        return ctx.op.getType() == SqlBaseLexer.MUL ? left * right : left / right;
    }

    @Override
    public Integer visitAddSub(SqlBaseParser.AddSubContext ctx) {
        int left = visit(ctx.expr(0));
        int right = visit(ctx.expr(1));
        return ctx.op.getType() == SqlBaseLexer.ADD ? left + right : left - right;
    }

    @Override
    public Integer visitId(SqlBaseParser.IdContext ctx) {
        String id = ctx.ID().getText();
        if (varibleMap.containsKey(id)) {
            return varibleMap.get(id);
        }
        return 0;
    }

    @Override
    public Integer visitInt(SqlBaseParser.IntContext ctx) {
        return Integer.valueOf(ctx.INT().getText());
    }
}
